package com.easybuilder.core.table.service.impl;

import com.easybuilder.core.table.dao.TableInfoDao;
import com.easybuilder.core.table.entity.SysTableInfo;
import com.easybuilder.core.table.service.TableInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.ArrayList;
import java.util.List;

@Service
public class TableInfoServiceImpl implements TableInfoService {
    @Autowired
    private TableInfoDao tableInfoDao;
    /** 系统字段 */
    private static final List<SysTableInfo> SYSTEM_COLUMNS = new ArrayList<>();
    // 初始化系统字段集合
    static {
        // 系统字段数组（主键、删除状态、创建时间、创建人、更新时间、更新人）
        String[] columns = {"id","drop_status","create_time", "create_user", "update_time", "update_user"};
        // 字段描述
        String[] comments = {"主键","删除状态", "创建时间", "创建人", "更新时间", "更新人"};
        // 字段类型
        String[] types = {"bigint", "int", "datetime", "varchar", "datetime", "varchar"};
        // 字段长度
        Integer[] length = {20, 11, 0, 255, 0, 255};
        // 默认值
        String[] defaultValues = {null, "0", null, null, null, null };
        // 额外信息
        String[] extras = {"AUTO_INCREMENT", null, null, null, null, null};
        // 键信息
        String[] keys = {"PRI", null, null, null, null, null};
        // not null
        Integer[] notNull = {1, 0, 0, 0, 0, 0};
        for (int i = 0; i < columns.length; i++) {
            SysTableInfo tableInfo = new SysTableInfo();
            tableInfo.setColumnName(columns[i]);
            tableInfo.setComment(comments[i]);
            tableInfo.setColumnType(types[i]);
            tableInfo.setLength(length[i]);
            tableInfo.setDefaultValue(defaultValues[i]);
            tableInfo.setExtra(extras[i]);
            tableInfo.setColumnKey(keys[i]);
            tableInfo.setNotNull(notNull[i]);
            tableInfo.setSystem(1);
            tableInfo.setSort(i);
            SYSTEM_COLUMNS.add(tableInfo);
        }
    }
    /** 数据保存 （新增或更新）
     * @return*/
    @Override
    public List<SysTableInfo> save(List<SysTableInfo> sysTableInfos) {
        sysTableInfos.forEach(item -> {
            if (null == item.getId()) {
                // 如果主键为空，执行插入操作
                /** 有两个地方需要更新此字段：1.新增tableInfo记录时，与columnName一致；2.更新表结构完成后，与columnName一致 */
                item.setColumnNameOld(item.getColumnName());
                tableInfoDao.insertSelective(item);
            } else {
                // 如果主键不为空，执行更新操作
                tableInfoDao.updateByPrimaryKeySelective(item);
            }
        });
        return sysTableInfos;
    }

    /***
     * @Author zhangxingshuai
     * @Description //TODO 根据table_id，查询tableInfo
     * @Date 14:44 2021/8/23
     * @Param [table_id]
     * @return java.util.List<com.easybuilder.core.table.entity.SysTableInfo>
     **/
    @Override
    public List<SysTableInfo> selectByTableId(Long table_id) {
        Example example = new Example(SysTableInfo.class);
        example.createCriteria().andEqualTo("tableId", table_id);
        example.orderBy("sort");
        return tableInfoDao.selectByExample(example);
    }

    /**
     * @Author zhangxingshuai
     * @Description //TODO 创建系统字段（创建完表后对系统字段进行初始化）
     * @Date 15:14 2021/8/23
     * @Param [id]
     * @return void
     **/
    @Override
    public void createSystemColumn(Long table_id) {
        for (SysTableInfo tableInfo : SYSTEM_COLUMNS) {
            try {
                SysTableInfo systemTableInfo = tableInfo.clone();
                systemTableInfo.setTableId(table_id);
                systemTableInfo.setColumnNameOld(systemTableInfo.getColumnName());
                tableInfoDao.insertSelective(systemTableInfo);
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @Author zhangxingshuai
     * @Description //TODO 根据table_id，删除对应的tableInfo数据
     * @Date 15:43 2021/8/23
     * @Param [id]
     * @return void
     **/
    @Override
    public void deleteByTableId(Long table_id) {
        Example example = new Example(SysTableInfo.class);
        example.createCriteria().andEqualTo("tableId", table_id);
        tableInfoDao.deleteByExample(example);
    }

    /** 更新 */
    @Override
    public int updateByPrimaryKeySelective(SysTableInfo tableInfo) {
        return tableInfoDao.updateByPrimaryKeySelective(tableInfo);
    }

    /** 条件更新 */
    @Override
    public int updateByExampleSelective(SysTableInfo tableInfo, Object example) {
        return tableInfoDao.updateByExampleSelective(tableInfo, example);
    }

    /** 同步旧字段名 */
    @Override
    public void synchColumnOldName(Long id) {

        tableInfoDao.synchColumnOldName(id);
    }
}
